//给定一个字符串数组 strs ，将 变位词 组合在一起。 可以按任意顺序返回结果列表。 
//
// 注意：若两个字符串中每个字符出现的次数都相同，则称它们互为变位词。 
//
// 
//
// 示例 1： 
//
// 
//输入: strs = ["eat", "tea", "tan", "ate", "nat", "bat"]
//输出: [["bat"],["nat","tan"],["ate","eat","tea"]] 
//
// 示例 2： 
//
// 
//输入: strs = [""]
//输出: [[""]]
// 
//
// 示例 3： 
//
// 
//输入: strs = ["a"]
//输出: [["a"]] 
//
// 
//
// 提示： 
//
// 
// 1 <= strs.length <= 10⁴ 
// 0 <= strs[i].length <= 100 
// strs[i] 仅包含小写字母 
// 
//
// 
//
// 
// 注意：本题与主站 49 题相同： https://leetcode-cn.com/problems/group-anagrams/ 
//
// Related Topics 数组 哈希表 字符串 排序 👍 68 👎 0


package LeetCode.editor.cn;


import java.util.*;

/**
 * @author ldltd
 * @date 2025-01-23 16:54:53
 * @description LCR 033.字母异位词分组
 
 */
 
public class Sfvd7V {
    public static void main(String[] args) {
    //测试代码
    Sfvd7V fun = new Sfvd7V();
    Solution solution= fun.new Solution();
    
    }

//leetcode submit region begin(Prohibit modification and deletion)
class Solution {
        //性能非常一般
    public List<List<String>> groupAnagrams1(String[] strs) {
        Map<int  [],Integer> map =new HashMap<>();
        List<List<String>> res=new ArrayList<>();
        outer:
        for (String str : strs) {
            int [] ar=new int[128];
            for (char c : str.toCharArray()) {
                ar[c]++;
            }
            inner:
            for (Map.Entry<int[], Integer> integerEntry : map.entrySet()) {
                if(Arrays.equals(integerEntry.getKey(),ar)){
                    res.get(integerEntry.getValue()).add(str);
                    continue outer;
                }
            }
            List<String> t=new ArrayList<>();
            t.add(str);
            res.add(t);
            map.put(ar,res.size()-1);
        }
        return res;
    }
    //比第一个快，但是也很一般
    public List<List<String>> groupAnagrams2(String[] strs) {
        Map<String, List<String>> map = new HashMap<>();
        for (String str : strs) {
            String s = str.chars()
                    .sorted()
                    .collect(StringBuffer::new, StringBuffer::appendCodePoint, StringBuffer::append)
                    .toString();
            map.computeIfAbsent(String.valueOf(s.hashCode()), k -> new ArrayList<>()).add(str);
        }
        return new ArrayList<>(map.values());
    }
    public List<List<String>> groupAnagrams(String[] strs) {
        Map<String, List<String>> map = new HashMap<String, List<String>>();
        for (String str : strs) {
            char[] array = str.toCharArray();
            Arrays.sort(array);
            String key = new String(array);
            List<String> list = map.getOrDefault(key, new ArrayList<String>());
            list.add(str);
            map.put(key, list);
        }
        return new ArrayList<List<String>>(map.values());
    }

}
//leetcode submit region end(Prohibit modification and deletion)

}
